package com.lyq.view;

import com.lyq.bean.Student;
import com.lyq.dao.StudentDao;
import com.lyq.utils.Tools;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;
import static com.lyq.dao.StudentDao.getStudent;

/**
 * 学生信息管理系统的主界面类
 * 负责创建和初始化系统的主窗口及所有UI组件
 */
public class ManageView {

    // 窗口宽度常量
    private final int WIDTH = 800;

    // 窗口高度常量
    private final int HEIGHT = 725;

    // 主窗口对象
    private final JFrame frame;

    // 姓名输入框
    private JTextField nameTextField;

    // 年级输入框
    private JTextField gradeTextField;

    // 学号输入框
    private JTextField studentIDTextField;

    // 班级输入框
    private JTextField cohortTextField;

    // 表格模式
    private DefaultTableModel tableModel;

    // 当前页数
    private int currentPage = 1;

    // 每次加载 50 条
    private final int pageSize = 50;

    // 学生数据列表
    private List<Student> students;

    // 带有滚动条的面板
    private JScrollPane scrollPane;

    // 是否继续加载
    private boolean isLoading = true;

    // 姓名
    String name;

    // 年级
    String grade;

    // 班级
    String cohort;

    // 学号
    String studentID;

    // 性别
    String sex;


    /**
     * 构造方法：初始化主窗口并设置基本属性
     */
    ManageView(){
        // 初始化主窗口
        frame = new JFrame();
        // 初始化界面组件
        initView();
        // 设置窗口标题
        frame.setTitle("学生管理系统");
        // 使用绝对布局（手动指定组件位置和大小）
        frame.setLayout(null);
        // 设置窗口不可调整大小
        frame.setResizable(false);
        // 调用工具类方法设置窗口居中显示
        Tools.setPos(frame,WIDTH,HEIGHT);
        // 设置窗口可见
        frame.setVisible(true);
        // 设置窗口关闭时退出程序
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 设置窗口图标
        try {
            // 通过类加载器获取图片资源（位于resources/image目录下）
            URL imageUrl = getClass().getResource("/image/logo.png");
            if (imageUrl != null) {
                // 读取图片并设置为窗口图标
                Image logo = ImageIO.read(imageUrl);
                frame.setIconImage(logo);
            } else {
                System.out.println("LOGO图标不存在");
            }
        } catch (IOException e) {
            System.out.println("LOGO图标加载失败");
        }

        // 验证窗口中的组件布局
        frame.validate();
    }

    /**
     * 初始化界面组件
     */
    private void initView() {
        // 创建菜单栏
        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);

        // 创建"管理"菜单
        JMenu mnNewMenu = new JMenu("个人中心");
        menuBar.add(mnNewMenu);

        // 创建"修改密码"菜单项
        JMenuItem mntmNewMenuItem = new JMenuItem("修改密码");
        mnNewMenu.add(mntmNewMenuItem);

        mntmNewMenuItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                new ChangPasswordView();
            }
        });

        // 创建基本信息管理面板
        JPanel panel = new JPanel();

        // 使用绝对布局
        panel.setLayout(null);

        // 设置面板位置和大小
        panel.setBounds(10, 10, 766, 125);

        // 设置面板标题边框
        panel.setBorder(new TitledBorder(null, "基本信息管理",
                TitledBorder.LEADING, TitledBorder.TOP, null, null));
        frame.getContentPane().add(panel, BorderLayout.NORTH);

        // 学号标签
        JLabel studentIDLabel = new JLabel("学号");
        studentIDLabel.setBounds(30, 35, 35, 14);
        panel.add(studentIDLabel);


        // 学号输入框
        studentIDTextField = new JTextField();
        studentIDTextField.setColumns(10);
        studentIDTextField.setBounds(65, 33, 110, 20);
        panel.add(studentIDTextField);

        // 姓名标签
        JLabel nameLabel = new JLabel("姓名");
        nameLabel.setBounds(185, 35, 35, 14);
        panel.add(nameLabel);

        // 姓名输入框
        nameTextField = new JTextField();
        nameTextField.setBounds(220, 33, 60, 20);
        panel.add(nameTextField);
        nameTextField.setColumns(10);


        // 创建按钮组，用于管理单选按钮
        ButtonGroup genderGroup = new ButtonGroup();

        // 性别选择：男
        JRadioButton manRadioButton = new JRadioButton("男");
        manRadioButton.setBounds(290, 31, 40, 22);

        // 将男按钮加入按钮组
        genderGroup.add(manRadioButton);
        panel.add(manRadioButton);

        // 性别选择：女
        JRadioButton woManRadioButton = new JRadioButton("女");
        woManRadioButton.setBounds(330, 31, 40, 22);

        // 将女按钮加入按钮组
        genderGroup.add(woManRadioButton);
        panel.add(woManRadioButton);

        // 性别选择：全部
        JRadioButton allRadioButton = new JRadioButton("全部");
        allRadioButton.setBounds(370, 31, 50, 22);
        allRadioButton.setSelected(true);

        // 将全部按钮加入按钮组
        genderGroup.add(allRadioButton);
        panel.add(allRadioButton);

        // 年级标签
        JLabel gradeLabel = new JLabel("年级");
        gradeLabel.setBounds(430, 35, 35, 14);
        panel.add(gradeLabel);

        // 年级输入框
        gradeTextField = new JTextField();
        gradeTextField.setColumns(10);
        gradeTextField.setBounds(465, 33, 110, 20);
        panel.add(gradeTextField);

        // 班级标签
        JLabel classLabel = new JLabel("班级");
        classLabel.setBounds(585, 35, 35, 14);
        panel.add(classLabel);

        // 班级输入框
        cohortTextField = new JTextField();
        cohortTextField.setColumns(10);
        cohortTextField.setBounds(620, 33, 110, 20);
        panel.add(cohortTextField);

        // 添加学生按钮
        JButton AddStudentButton = new JButton("添加学生");
        AddStudentButton.setBounds(30, 75, 100, 22);
        panel.add(AddStudentButton);

        // 添加学生
        AddStudentButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String name = nameTextField.getText();
                String grade = gradeTextField.getText();
                String cohort = cohortTextField.getText();
                String studentID = studentIDTextField.getText();
                String sex;
                if (manRadioButton.isSelected()) {
                    sex = "男";
                }else if (woManRadioButton.isSelected()) {
                    sex = "女";
                }else {
                    sex = "";
                }

                //判断添加的信息的合法性
                if (name.isEmpty()) {
                    Tools.showMessage("请填写姓名");
                }else if (sex.isEmpty()){
                    Tools.showMessage("请选择性别");
                }else if (grade.isEmpty()){
                    Tools.showMessage("请填写年级");
                }else if (cohort.isEmpty()){
                    Tools.showMessage("请填写班级");
                }else if (studentID.isEmpty()){
                    Tools.showMessage("请填写学号");
                }else {

                    // 进行添加
                    Student student = new Student(studentID,name,sex,grade,cohort);
                    int result = StudentDao.addStudent(student);

                    // 判断是否添加成功
                    if (result == 1){
                        JOptionPane.showMessageDialog(frame,
                                "添加成功！",
                                "提示",
                                JOptionPane.INFORMATION_MESSAGE);
                        nameTextField.setText("");
                        gradeTextField.setText("");
                        cohortTextField.setText("");
                        studentIDTextField.setText("");
                        allRadioButton.setSelected(true);

                    }else {
                        Tools.showMessage("学号冲突");
                    }
                }
            }
        });

        // 查找学生按钮
        JButton findStudentButton = new JButton("查找学生");
        findStudentButton.setBounds(140, 75, 100, 22);
        panel.add(findStudentButton);

        // 监听查找学生按钮
        findStudentButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 姓名
                name = nameTextField.getText();

                // 年级
                grade = gradeTextField.getText();

                // 班级
                cohort = cohortTextField.getText();

                // 学号
                studentID = studentIDTextField.getText();

                // 性别
                if (manRadioButton.isSelected()) {
                    sex = "男";
                }else if (woManRadioButton.isSelected()) {
                    sex = "女";
                }else {
                    sex = "";
                }

                // 重置状态和数据
                tableModel.setRowCount(0);
                students = null;
                currentPage = 1;
                isLoading = true;

                // 重置滚动条
                scrollPane.getVerticalScrollBar().setValue(0);

                // 查询学生数据
                students = getStudent(currentPage,pageSize,studentID, name, sex, grade, cohort);

                // 遍历学生数据
                for (Student student : students) {
                    Object[] row = {
                            student.getStu_id(),      // 学号
                            student.getName(),        // 姓名
                            student.getSex(),         // 性别
                            student.getGrade(),       // 年级
                            student.getCohort(),       // 班级
                            "编辑",                   // 显示“编辑”
                            "删除"                    // 显示“删除”
                    };

                    // 学生数据添加到表格中
                    tableModel.addRow(row);
                }
            }

        });

        // 重置按钮（清空输入框）
        JButton resetStudentButton = new JButton("重置");
        resetStudentButton.setBounds(250, 75, 100, 22);
        resetStudentButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nameTextField.setText("");
                gradeTextField.setText("");
                cohortTextField.setText("");
                studentIDTextField.setText("");
                allRadioButton.setSelected(true);
            }
        });
        panel.add(resetStudentButton);

        // 学生信息展示面板
        JPanel studentInformationDisplayPanel = new JPanel();
        studentInformationDisplayPanel.setBorder(new TitledBorder(null, "学生信息显示",
                TitledBorder.LEADING, TitledBorder.TOP, null, null));
        studentInformationDisplayPanel.setBounds(10, 145, 766, 500);
        frame.getContentPane().add(studentInformationDisplayPanel);
        studentInformationDisplayPanel.setLayout(null);

        // 表格模式
        tableModel = new DefaultTableModel(){
            // 表格是否可编辑
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };

        // 表头数据
        Object[] tableColumn = {"学号","姓名","性别","年级","班级","操作","操作"};

        // 设置表头
        tableModel.setColumnIdentifiers(tableColumn);

        // 创建表格
        JTable table = new JTable();
        table.setModel(tableModel);

        // 禁止表头排序
        table.getTableHeader().setReorderingAllowed(false);

        // 禁止表格拖拽
        table.getTableHeader().setResizingAllowed(false);

        // 为每一列设置宽度
        TableColumnModel columnModel = table.getColumnModel();
        columnModel.getColumn(0).setPreferredWidth(80);  // 学号列宽
        columnModel.getColumn(1).setPreferredWidth(20);   // 姓名列宽
        columnModel.getColumn(2).setPreferredWidth(20);   // 性别列宽
        columnModel.getColumn(3).setPreferredWidth(60);   // 年级列宽
        columnModel.getColumn(4).setPreferredWidth(120);   // 班级列宽
        columnModel.getColumn(5).setPreferredWidth(20);   // 编辑按钮列宽
        columnModel.getColumn(6).setPreferredWidth(20);   // 删除按钮列宽

        // 带有滚动条的面板
        scrollPane = new JScrollPane(table);
        scrollPane.setBounds(20, 30, 726, 450);
        studentInformationDisplayPanel.add(scrollPane);

        // 垂直滚动条添加一个调整监听器
        scrollPane.getVerticalScrollBar().addAdjustmentListener(e -> {

            // 防止用户正在拖动时反复触发
            if (e.getValueIsAdjusting()) {
                return;
            }

            // 获取触发事件的滚动条对象
            JScrollBar bar = (JScrollBar) e.getSource();

            // 获取滚动条的最大值
            int max = bar.getMaximum();

            // 获取滚动条当前的值
            int value = bar.getValue();

            // 相当于滚动条滑块本身的长度
            int extent = bar.getModel().getExtent();

            // 滚动到底部附近（差 10 像素触发）
            if (max - value - extent < 10 && max > extent) {

                // 判断是否继续加载
                if (!isLoading){
                    return;
                }

                // 查询学生数据
                List<Student> moreStudents = getStudent(currentPage+1, pageSize, studentID, name, sex, grade, cohort);

                // 学生数据不为空
                if (!moreStudents.isEmpty()){

                    // 增加页码
                    currentPage++;

                    // 遍历学生数据
                    for (Student student : moreStudents) {
                        Object[] row = {
                                student.getStu_id(),
                                student.getName(),
                                student.getSex(),
                                student.getGrade(),
                                student.getCohort(),
                                "编辑",                   // 显示“编辑”
                                "删除"                    // 显示“删除”
                        };

                        // 表格添加学生数据
                        tableModel.addRow(row);
                    }
                }else {
                    // 没有学生数据了，不再加载
                    isLoading = false;
                }
            }
        });

        // 自定义渲染器让编辑和删除文字变蓝
        class HyperlinkRenderer extends DefaultTableCellRenderer {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value,
                                                           boolean isSelected, boolean hasFocus,
                                                           int row, int column) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                setForeground(Color.BLUE);
                setFont(getFont().deriveFont(Font.BOLD));
                setHorizontalAlignment(JLabel.CENTER);
                return this;
            }
        }


        // 自定义渲染器应用到操作列
        table.getColumnModel().getColumn(5).setCellRenderer(new HyperlinkRenderer());
        table.getColumnModel().getColumn(6).setCellRenderer(new HyperlinkRenderer());


        // 表格居中显示
        DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        renderer.setHorizontalAlignment(JLabel.CENTER);
        table.setDefaultRenderer(Object.class, renderer);

        // 给表格添加鼠标点击监听
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // 获取点击的行和列
                int row = table.rowAtPoint(e.getPoint());  // 点击的行
                int col = table.columnAtPoint(e.getPoint()); // 点击的列

                // 是否点击了有效单元格
                if (row < 0 || col < 0) return;

                // 获取该行的学生信息
                String stuId = tableModel.getValueAt(row, 0).toString();
                String name = tableModel.getValueAt(row, 1).toString();
                String sex = tableModel.getValueAt(row, 2).toString();
                String grade = tableModel.getValueAt(row, 3).toString();
                String cohort = tableModel.getValueAt(row, 4).toString();


                // 判断点击的是哪一列
                if (col == 5) {
                    // 点击了编辑列

                    new StudenEditView(stuId,name,sex,grade,cohort, student -> {
                        // 更新表格中对应行的数据
                        tableModel.setValueAt(student.getStu_id(), row, 0);
                        tableModel.setValueAt(student.getName(), row, 1);
                        tableModel.setValueAt(student.getSex(), row, 2);
                        tableModel.setValueAt(student.getGrade(), row, 3);
                        tableModel.setValueAt(student.getCohort(), row, 4);
                    });
                }
                else if (col == 6) {
                    // 点击了删除列
                    int confirm = JOptionPane.showConfirmDialog(
                            frame,
                            "确定要删除学生 " + name + " 吗？",
                            "确认删除",
                            JOptionPane.YES_NO_OPTION
                    );
                    if (confirm == JOptionPane.YES_OPTION) {
                        // 执行删除
                        int result = StudentDao.deleteStudent(stuId);
                        if (result > 0) {
                            JOptionPane.showMessageDialog(frame,
                                    "删除成功！",
                                    "提示",
                                    JOptionPane.INFORMATION_MESSAGE);
                            tableModel.removeRow(row); // 删除表格行
                        } else {
                            Tools.showMessage("删除失败！");
                        }
                    }
                }
            }
        });
    }

}